package rothag.views.homemenu;

import java.awt.Color;
import java.awt.Font;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.ArrayList;
import javax.swing.JLabel;
import javax.swing.JTextField;
import javax.swing.SwingConstants;
import javax.swing.text.AttributeSet;
import javax.swing.text.BadLocationException;
import javax.swing.text.PlainDocument;
import rothag.controller.MainController;
import rothag.graphics.*;

import rothag.views.JButtonBase;
import rothag.views.JPanelBase;

/**
 *
 * @author Gaetan
 */
public class NouvellePartieJPanel extends JPanelBase implements ActionListener, KeyListener {

    private JTextField joueurUn;
    private JTextField joueurDeux;
    private JTextField joueurTrois;
    private JTextField joueurQuatre;
    private JButtonBase valider;
    private JButtonBase annuler;
    private int maxLength;

    public NouvellePartieJPanel(MainController controller) {
        super(controller);

        maxLength = 9;

        setBackground(new Color(0, 0, 0, 150));

        hauteur = 3 * GraphicsParameters.mainHeight / 4;
        largeur = GraphicsParameters.mainWidth / 2;

        Font font = GraphicsHelper.getFont(20, "italic");

        JLabel label = new JLabel("Sélection des joueurs");
        label.setHorizontalAlignment(SwingConstants.CENTER);
        label.setFont(font);
        label.setForeground(Color.WHITE);
        label.setBounds(0, 20, largeur, 50);
        add(label);

        int x = 100;
        int y = 130;
        int espace = 50;
        int largeurLabel = 100;
        int hauteurLabel = 30;

        font = GraphicsHelper.getFont(15, null);

        label = new JLabel("Joueur 1");
        label.setFont(font);
        label.setForeground(Color.WHITE);
        label.setBounds(x, y, largeurLabel, hauteurLabel);
        add(label);

        y += espace + hauteurLabel;

        label = new JLabel("Joueur 2");
        label.setFont(font);
        label.setForeground(Color.WHITE);
        label.setBounds(x, y, largeurLabel, hauteurLabel);
        add(label);

        y += espace + hauteurLabel;

        label = new JLabel("Joueur 3");
        label.setFont(font);
        label.setForeground(Color.WHITE);
        label.setBounds(x, y, largeurLabel, hauteurLabel);
        add(label);

        y += espace + hauteurLabel;

        label = new JLabel("Joueur 4");
        label.setFont(font);
        label.setForeground(Color.WHITE);
        label.setBounds(x, y, largeurLabel, hauteurLabel);
        add(label);

        int largeurText = 200;
        int hauteurText = 30;
        x += largeurLabel;
        y = 130;

        joueurUn = new JTextField();
        joueurUn.setFont(font);
        joueurUn.setBorder(null);
        joueurUn.setHorizontalAlignment(SwingConstants.CENTER);
        joueurUn.setBounds(x, y, largeurText, hauteurText);
        joueurUn.addKeyListener(this);
        add(joueurUn);

        y += espace + hauteurText;

        joueurDeux = new JTextField();
        joueurDeux.setFont(font);
        joueurDeux.setBorder(null);
        joueurDeux.setHorizontalAlignment(SwingConstants.CENTER);
        joueurDeux.setBounds(x, y, largeurText, hauteurText);
        joueurDeux.addKeyListener(this);
        add(joueurDeux);

        y += espace + hauteurText;

        joueurTrois = new JTextField();
        joueurTrois.setFont(font);
        joueurTrois.setBorder(null);
        joueurTrois.setHorizontalAlignment(SwingConstants.CENTER);
        joueurTrois.setBounds(x, y, largeurText, hauteurText);
        joueurTrois.addKeyListener(this);
        add(joueurTrois);

        y += espace + hauteurText;

        joueurQuatre = new JTextField();
        joueurQuatre.setFont(font);
        joueurQuatre.setBorder(null);
        joueurQuatre.setHorizontalAlignment(SwingConstants.CENTER);
        joueurQuatre.setBounds(x, y, largeurText, hauteurText);
        joueurQuatre.addKeyListener(this);
        add(joueurQuatre);

        // Limitation du nombre de caractères
        joueurUn.setDocument(new TextLimiter(maxLength));
        joueurDeux.setDocument(new TextLimiter(maxLength));
        joueurTrois.setDocument(new TextLimiter(maxLength));
        joueurQuatre.setDocument(new TextLimiter(maxLength));

        valider = new JButtonBase("Valider");
        valider.setFont(font);
        valider.setBounds(largeur - 150, hauteur - 75, 100, 50);
        valider.addActionListener(this);
        valider.addKeyListener(this);
        add(valider);

        annuler = new JButtonBase("Annuler");
        annuler.setFont(font);
        annuler.setBounds(largeur - 270, hauteur - 75, 100, 50);
        annuler.addActionListener(this);
        annuler.addKeyListener(this);
        add(annuler);
    }

    public void reset() {
        joueurUn.setText("");
        joueurDeux.setText("");
        joueurTrois.setText("");
        joueurQuatre.setText("");
    }

    public void actionPerformed(ActionEvent e) {
        if (e.getSource() == valider) {
            validerNouvellePartie();
        } else if (e.getSource() == annuler) {
            annulerNouvellePartie();
        }
    }

    public void keyTyped(KeyEvent arg0) {
    }

    public void keyPressed(KeyEvent arg0) {
        if (arg0.getKeyCode() == KeyEvent.VK_ENTER) {
            validerNouvellePartie();
        } else if (arg0.getKeyCode() == KeyEvent.VK_ESCAPE) {
            annulerNouvellePartie();
        }
    }

    public void keyReleased(KeyEvent arg0) {
    }

    public void validerNouvellePartie() {
        ArrayList<String> listeNom = new ArrayList<String>();
        if (!joueurUn.getText().trim().equals("")) {
            listeNom.add(joueurUn.getText().trim());
        }
        if (!joueurDeux.getText().trim().equals("")) {
            listeNom.add(joueurDeux.getText().trim());
        }
        if (!joueurTrois.getText().trim().equals("")) {
            listeNom.add(joueurTrois.getText().trim());
        }
        if (!joueurQuatre.getText().trim().equals("")) {
            listeNom.add(joueurQuatre.getText().trim());
        }

        if (listeNom.size() > 0) {
            controller.nouvellePartie(listeNom);
        } else {
            GraphicsHelper.afficherErreur("Création partie", "Veuillez saisir au moins un nom.", this).setVisible(true);
        }
    }

    public void annulerNouvellePartie() {
        setVisible(false);
        if (getParent() instanceof HomeMenuJPanel) {
            ((HomeMenuJPanel) getParent()).menuPrincipal();
        }
    }

    @Override
    public void setVisible(boolean valeur) {
        super.setVisible(valeur);
        joueurUn.requestFocus();
    }

    public class TextLimiter extends PlainDocument {

        private static final long serialVersionUID = 6016644222758009922L;
        private int max;

        public TextLimiter(int max) {
            super();

            this.max = max;
        }

        @Override
        public void insertString(int offset, String str, AttributeSet attrs) throws BadLocationException {
            if (str != null && getLength() + str.length() > max) {
                Toolkit.getDefaultToolkit().beep();
            } else {
                super.insertString(offset, str, attrs);
            }
        }

        @Override
        public void replace(int offset, int length, String str, AttributeSet attrs)
                throws BadLocationException {
            if (str != null && getLength() + str.length() - length > max) {
                Toolkit.getDefaultToolkit().beep();
            } else {
                super.replace(offset, length, str, attrs);
            }
        }
    }
}
